package com.gsdl.model.delegate;

import java.util.List;

import com.gsdl.model.bo.CentroBO;
import com.gsdl.model.bo.DepositoBO;
import com.gsdl.model.bo.EntradaBO;
import com.gsdl.model.bo.MaterialBO;
import com.gsdl.model.bo.MovimentoBO;
import com.gsdl.model.bo.PedidoBO;
import com.gsdl.model.bo.StockBO;
import com.gsdl.model.bo.UtilizadorBO;
import com.gsdl.model.entity.CategoriaMaterial;
import com.gsdl.model.entity.Centro;
import com.gsdl.model.entity.Deposito;
import com.gsdl.model.entity.Deposito.TipoDeposito;
import com.gsdl.model.entity.Entrada;
import com.gsdl.model.entity.Material;
import com.gsdl.model.entity.Movimento;
import com.gsdl.model.entity.Movimento.TipoMovimento;
import com.gsdl.model.entity.Pedido;
import com.gsdl.model.entity.Pedido.EstadoPedido;
import com.gsdl.model.entity.Stock;
import com.gsdl.model.entity.TipoPedido;
import com.gsdl.model.entity.Utilizador;


// TODO: Auto-generated Javadoc
/**
 * The Class BusinessDelegate.
 * 
 * entry point for business logic
 * 
 */
public class BusinessDelegate {

//	private static final Logger LOG = Logger.getLogger(BusinessDelegate.class.getName());
	
	
	/** The instance. */
private static BusinessDelegate instance = new BusinessDelegate();
	
	/**
	 * Gets the single instance of BusinessDelegate.
	 *
	 * @return single instance of BusinessDelegate
	 */
	public static BusinessDelegate getInstance() {
		return instance;
	}

	/**
	 * Instantiates a new business delegate.
	 */
	private BusinessDelegate() {
		
	}
	
	/**
	 * Save centro.
	 *
	 * @param centro the centro
	 * @return the centro
	 */
	public Centro saveCentro(Centro centro){
		CentroBO.getInstance().save(centro);
		return centro;
	}
	
	/**
	 * Gets the all centros.
	 *
	 * @return the all centros
	 */
	public List<Centro> getAllCentros(){
		List<Centro> list = CentroBO.getInstance().getAll();
		return list;
	}
	
	/**
	 * Removes the centro.
	 *
	 * @param centro the centro
	 */
	public void removeCentro(Centro centro){
		CentroBO.getInstance().remove(centro);
	}
	
	/**
	 * Gets the centro by id.
	 *
	 * @param id the id
	 * @return the centro by id
	 */
	public Centro getCentroById(Long id) {
		Centro centro = CentroBO.getInstance().getById(id);
		return centro;
	}
	
	/**
	 * Gets the all depositos.
	 *
	 * @return the all depositos
	 */
	public List<Deposito> getAllDepositos() {
		List<Deposito> depositos = DepositoBO.getInstance().getAll();
		return depositos;
	}
	
	/**
	 * Gets the deposito by id.
	 *
	 * @param id the id
	 * @return the deposito by id
	 */
	public Deposito getDepositoById(Long id) {
		Deposito deposito = DepositoBO.getInstance().getById(id);
		return deposito;
	}
	
	/**
	 * Removes the deposito.
	 *
	 * @param deposito the deposito
	 */
	public void removeDeposito(Deposito deposito){
		DepositoBO.getInstance().remove(deposito);
	}
	
	/**
	 * Save deposito.
	 *
	 * @param novoDeposito the novo deposito
	 * @return the deposito
	 */
	public Deposito saveDeposito(Deposito novoDeposito) {
		DepositoBO.getInstance().save(novoDeposito);
		return novoDeposito;
	}
	
	/**
	 * Gets the deposito by centro.
	 *
	 * @param centro the centro
	 * @return the deposito by centro
	 */
	public List<Deposito> getDepositoByCentro(Centro centro) {
		List<Deposito> list = DepositoBO.getInstance().getByCentro(centro);
		return list;
	}
	
	/**
	 * Gets the deposito expedicao by centro.
	 *
	 * @param centro the centro
	 * @return the deposito expedicao by centro
	 */
	public List<Deposito> getDepositoExpedicaoByCentro(Centro centro) {
		List<Deposito> list = DepositoBO.getInstance().getByCentroAndTipo(centro, TipoDeposito.EXPEDICAO);
		return list;
	}
	
	/**
	 * Gets the deposito armazenamento by centro.
	 *
	 * @param centro the centro
	 * @return the deposito armazenamento by centro
	 */
	public List<Deposito> getDepositoArmazenamentoByCentro(Centro centro) {
		List<Deposito> list = DepositoBO.getInstance().getByCentroAndTipo(centro, TipoDeposito.ARMAZENAMENTO);
		return list;
	}
	
	/**
	 * Gets the deposito by material.
	 *
	 * @param material the material
	 * @return the deposito by material
	 */
	public List<Deposito> getDepositoByMaterial(Material material) {
		List<Deposito> list = DepositoBO.getInstance().getByMaterial(material);
		return list;
	}
	
	/**
	 * Gets the depositos armazenamento.
	 *
	 * @return the depositos armazenamento
	 */
	public List<Deposito> getDepositosArmazenamento() {
		List<Deposito> list = DepositoBO.getInstance().getDepositosArmazenamento();
		return list;
	}
	
	/**
	 * Gets the stock deposito.
	 *
	 * @param deposito the deposito
	 * @return the stock deposito
	 */
	public List<Stock> getStockDeposito(Deposito deposito) {
		List<Stock> list = StockBO.getInstance().getByDeposito(deposito);
		return list;
	}
	
	/**
	 * Gets the stock list.
	 *
	 * @return the stock list
	 */
	public List<Stock> getStockList() {
		List<Stock> stockList = StockBO.getInstance().getAll();
		return stockList;
	}
	
	/**
	 * Gets the by centro and material.
	 *
	 * @param centro the centro
	 * @param material the material
	 * @return the by centro and material
	 */
	public List<Stock> getByCentroAndMaterial(Centro centro, Material material) {
		List<Stock> stockList = StockBO.getInstance().getByCentroAndMaterial(centro, material);
		return stockList;
	}
	
	/**
	 * Gets the stock list by centro.
	 *
	 * @param centro the centro
	 * @return the stock list by centro
	 */
	public List<Stock> getStockListByCentro(Centro centro) {
		List<Stock> stockList = StockBO.getInstance().getByCentro(centro);
		return stockList;
	}
	
	/**
	 * Gets the stock material.
	 *
	 * @param material the material
	 * @return the stock material
	 */
	public List<Stock> getStockMaterial(Material material) {
		List<Stock> list = StockBO.getInstance().getByMaterial(material);
		return list;
	}
	
	/**
	 * Gets the stock by deposito and material.
	 *
	 * @param deposito the deposito
	 * @param material the material
	 * @return the stock by deposito and material
	 */
	public List<Stock> getStockByDepositoAndMaterial(Deposito deposito, Material material) {
		List<Stock> list = StockBO.getInstance().getByDepositoAndMaterial(deposito, material);
		return list;
	}
	
	/**
	 * Gets the alerta stock.
	 *
	 * @return the alerta stock
	 */
	public List<Stock> getAlertaStock(){
		List<Stock> list = StockBO.getInstance().getAlertaStock();
		return list;
	}
	
	/**
	 * Save material.
	 *
	 * @param material the material
	 * @param stockList the stock list
	 * @return the material
	 */
	public Material saveMaterial(Material material, List<Stock> stockList){
		material = MaterialBO.getInstance().save(material, stockList);
		return material;
	}
	
	/**
	 * Removes the material.
	 *
	 * @param material the material
	 */
	public void removeMaterial(Material material){
		MaterialBO.getInstance().remove(material);
	}
	
	/**
	 * Gets the all material.
	 *
	 * @return the all material
	 */
	public List<Material> getAllMaterial() {
		List<Material> list = MaterialBO.getInstance().getAll();
		return list;
	}
	
	/**
	 * Gets the material by centro.
	 *
	 * @param centro the centro
	 * @return the material by centro
	 */
	public List<Material> getMaterialByCentro(Centro centro) {
		List<Material> list = MaterialBO.getInstance().getByCentro(centro);
		return list;
	}
		
	/**
	 * Gets the material by id.
	 *
	 * @param id the id
	 * @return the material by id
	 */
	public Material getMaterialById(Long id) {
		Material material = MaterialBO.getInstance().getById(id);
		return material;
	}
	
	/**
	 * Gets the categorias material.
	 *
	 * @return the categorias material
	 */
	public List<CategoriaMaterial> getCategoriasMaterial() {
		List<CategoriaMaterial>categoriasMaterial = MaterialBO.getInstance().getCategoriasMaterial();
		return categoriasMaterial;
	}
	
	/**
	 * Save pedido.
	 *
	 * @param pedido the pedido
	 * @param movimentos the movimentos
	 * @return the pedido
	 */
	public Pedido savePedido(Pedido pedido, List<Movimento> movimentos){
		PedidoBO.getInstance().savePedido(pedido, movimentos);
		return pedido;
	}
	
	/**
	 * Save pedido anulacao.
	 *
	 * @param pedido the pedido
	 * @param movimentos the movimentos
	 * @return the pedido
	 */
	public Pedido savePedidoAnulacao(Pedido pedido, List<Movimento> movimentos){
		PedidoBO.getInstance().savePedido(pedido, movimentos, TipoMovimento.REPOSICAO);
		return pedido;
	}
	
	/**
	 * Gets the all pedidos.
	 *
	 * @return the all pedidos
	 */
	public List<Pedido> getAllPedidos(){
		List<Pedido> list = PedidoBO.getInstance().getAll();
		return list;
	}
	
	/**
	 * Gets the pedido by id.
	 *
	 * @param id the id
	 * @return the pedido by id
	 */
	public Pedido getPedidoById(Long id) {
		Pedido pedido = PedidoBO.getInstance().getById(id);
		return pedido;
	}
	
	/**
	 * Removes the pedido.
	 *
	 * @param pedido the pedido
	 */
	public void removePedido(Pedido pedido){
		PedidoBO.getInstance().remove(pedido);
	}
	
	/**
	 * Gets the pedidos by centro.
	 *
	 * @param centro the centro
	 * @return the pedidos by centro
	 */
	public List<Pedido> getPedidosByCentro(Centro centro){
		List<Pedido> list = PedidoBO.getInstance().getPedidosByCentro(centro);
		return list;
	}
	
	/**
	 * Gets the pedidos by centro and estado.
	 *
	 * @param centro the centro
	 * @param estadoPedido the estado pedido
	 * @return the pedidos by centro and estado
	 */
	public List<Pedido> getPedidosByCentroAndEstado(Centro centro, EstadoPedido estadoPedido){
		List<Pedido> list = PedidoBO.getInstance().getPedidosByCentroAndEstado(centro, estadoPedido);
		return list;
	}
	
	/**
	 * Gets the pedidos by estado.
	 *
	 * @param estadoPedido the estado pedido
	 * @return the pedidos by estado
	 */
	public List<Pedido> getPedidosByEstado(EstadoPedido estadoPedido){
		List<Pedido> list = PedidoBO.getInstance().getPedidosByEstado(estadoPedido);
		return list;
	}
	
	/**
	 * Save movimento.
	 *
	 * @param movimento the movimento
	 * @return the movimento
	 */
	public Movimento saveMovimento(Movimento movimento){
		movimento = PedidoBO.getInstance().saveMovimento(movimento);
		return movimento;
	}
	
	/**
	 * Save expedicao.
	 *
	 * @param pedido the pedido
	 * @return the pedido
	 */
	public Pedido saveExpedicao(Pedido pedido){
		pedido = PedidoBO.getInstance().saveExpedicao(pedido);
		return pedido;
	}
	
	/**
	 * Gets the tipos pedido.
	 *
	 * @return the tipos pedido
	 */
	public List<TipoPedido> getTiposPedido() {
		List<TipoPedido> tiposPedido = PedidoBO.getInstance().getTiposPedido();
		return tiposPedido;
	}
	
	/**
	 * Gets the movimentos by material.
	 *
	 * @param material the material
	 * @return the movimentos by material
	 */
	public List<Movimento> getMovimentosByMaterial(Material material) {
		List<Movimento> list = MovimentoBO.getInstance().getMovimentosByMaterial(material);
		return list;
	}
	
	/**
	 * Gets the movimentos by deposito.
	 *
	 * @param deposito the deposito
	 * @return the movimentos by deposito
	 */
	public List<Movimento> getMovimentosByDeposito(Deposito deposito) {
		List<Movimento> list = MovimentoBO.getInstance().getMovimentosByDeposito(deposito);
		return list;
	}
	
	/**
	 * Gets the save entradamaterial.
	 *
	 * @param deposito the deposito
	 * @return the save entradamaterial
	 */
	public List<Movimento> getSaveEntradamaterial(Deposito deposito) {
		List<Movimento> list = MovimentoBO.getInstance().getMovimentosByDeposito(deposito);
		return list;
	}
		
	/**
	 * Save movimento and update stock.
	 *
	 * @param movimento the movimento
	 * @return the movimento
	 */
	public Movimento saveMovimentoAndUpdateStock(Movimento movimento) {
		movimento =  MovimentoBO.getInstance().saveMovimentoAndUpdateStock(movimento);
		return movimento;
	}
	
	/**
	 * Save movimentos and update stock.
	 *
	 * @param movimentos the movimentos
	 * @return the list
	 */
	public List<Movimento> saveMovimentosAndUpdateStock(List<Movimento> movimentos) {
		movimentos =  MovimentoBO.getInstance().saveMovimentosAndUpdateStock(movimentos);
		return movimentos;
	}

	/**
	 * Gets the all movimentos.
	 *
	 * @return the all movimentos
	 */
	public List<Movimento> getAllMovimentos() {
		List<Movimento> movimentos =  MovimentoBO.getInstance().getAll();
		return movimentos;
	}

	/**
	 * Gets the movimentos by deposito and material.
	 *
	 * @param deposito the deposito
	 * @param material the material
	 * @return the movimentos by deposito and material
	 */
	public List<Movimento> getMovimentosByDepositoAndMaterial(Deposito deposito, Material material) {
		List<Movimento> movimentos =  MovimentoBO.getInstance().getMovimentosByDepositoAndMaterial(deposito, material);
		return movimentos;
	}

	/**
	 * Login.
	 *
	 * @param userName the user name
	 * @param password the password
	 * @return the utilizador
	 */
	public Utilizador login(String userName, String password) {
		return UtilizadorBO.getInstance().login(userName, password);
	}

	/**
	 * Gets the all users.
	 *
	 * @return the all users
	 */
	public List<Utilizador> getAllUsers() {
		return UtilizadorBO.getInstance().getAll();
	}


	/**
	 * Save utilizador.
	 *
	 * @param utilizador the utilizador
	 * @return the utilizador
	 */
	public Utilizador saveUtilizador(Utilizador utilizador) {
		return UtilizadorBO.getInstance().save(utilizador);
		
	}

	/**
	 * Gets the utilizador by id.
	 *
	 * @param id the id
	 * @return the utilizador by id
	 */
	public Utilizador getUtilizadorById(long id) {
		return UtilizadorBO.getInstance().getById(id);
	}

	/**
	 * Save entrada.
	 *
	 * @param entrada the entrada
	 * @return the entrada
	 */
	public Entrada saveEntrada(Entrada entrada) {
		return EntradaBO.getInstance().saveEntrada(entrada);
	}
	
	/**
	 * Gets the entradas.
	 *
	 * @return the entradas
	 */
	public List<Entrada> getEntradas() {
		return EntradaBO.getInstance().getAll();
	}

	/**
	 * Gets the entradas by centro and deposito.
	 *
	 * @param centro the centro
	 * @param deposito the deposito
	 * @return the entradas by centro and deposito
	 */
	public List<Entrada> getEntradasByCentroAndDeposito(Centro centro, Deposito deposito) {
		return EntradaBO.getInstance().getEntradasByCentroAndDeposito(centro, deposito);
	}

	/**
	 * Gets the entradas by centro.
	 *
	 * @param centro the centro
	 * @return the entradas by centro
	 */
	public List<Entrada> getEntradasByCentro(Centro centro) {
		return EntradaBO.getInstance().getEntradasByCentro(centro);
	}

}
